
const target = [
    { pId: '-1', id: '0', name: '父级1' },
    { pId: '-1', id: '1', name: '父级1' },
    { pId: '0', id: '2', name: '父级2-1' },
    { pId: '0', id: '3', name: '父级3-2' },
    { pId: '2', id: '4', name: '子级4-1' },

]

function buildTree(target) {
    const temp = {}
    const tree = {}
    //数组转键值对
    target.forEach(item => {
        temp[item.id] = item
    });

    const tempKey = Object.keys(temp)

    tempKey.forEach(key => {
        //获取当前项
        const cur = temp[key]
        //当前pid
        const pid = cur.pId
        //获取父级项
        let parentItemByPid = temp[pid]
        if (parentItemByPid) {
            //第一次没有children时创建一个children=[]
            if (!parentItemByPid.children) {
                parentItemByPid.children = []
            }
            parentItemByPid.children.push(cur)
        } else {
            tree[cur.id] = cur
        }
    });
    console.log(tree);
    return Object.keys(tree).map(key => tree[key])

}

console.log(buildTree(target));

//方法二 
function jsonToTree(data) {
    // 初始化结果数组，并判断输入数据的格式
    let result = []
    if (!Array.isArray(data)) {
        return result
    }
    // 使用map，将当前对象的id与当前对象对应存储起来
    let map = {};
    data.forEach(item => {
        map[item.id] = item;
    });
    // 
    data.forEach(item => {
        let parent = map[item.pid];
        if (parent) {
            (parent.children || (parent.children = [])).push(item);
        } else {
            result.push(item);
        }
    });
    return result;
}



// var egs = [
//     { name_1: 'name_1...' },
//     { name_2: 'name_4...' },
//     { name_3: 'name_3...' },
//     { name_0: 'name_0...' },
// ]

// var result = {}
// var key = 'children'
// s(egs)

// function s(arrs) {
//     arrs.forEach((o, i) => {
//         console.log('---' + i + ': ', result)
//         if (!result[key]) {
//             result[key] = [o]
//         } else {
//             console.log("key", i, o);
//             o[key] = [result]
//             result = o
//         }
//     })
// }

// console.log(result)